package com.example.simple.aspect;

import com.alibaba.fastjson.JSONObject;
import com.example.simple.annotation.Log;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @ClassName LogAspect
 * @Description 运行结果：
 * 进来了LogAspect doBefore， myLog携带的信息:LOGIN_MODULE
 * SimpleController输出pathVariable=hello1
 * SimpleController输出reqDto={"password":"password123"}
 * 进来了LogAspect afterReturn， returnVal是:{"age":18,"name":"Kelvin"}
 * 进来了LogAspect doAfter， myLog携带的信息:LOGIN_MODULE
 *
 * @Author liukun
 * @Date 2022/6/9 08:53
 */
@Aspect
@Component
@Slf4j
public class LogAspect {

    @Before("@annotation(myLog)")
    public void doBefore(JoinPoint joinPoint, Log myLog){
        //通知-在目标方法被调用之前做增强处理
        log.info("进来了LogAspect doBefore， myLog携带的信息:{}", myLog.module());
    }

    @After("@annotation(myLog)")
    public void doAfter(JoinPoint joinPoint, Log myLog){
        //通知-在目标方法完成之后做增强
        log.info("进来了LogAspect doAfter， myLog携带的信息:{}", myLog.module());
    }

    @AfterReturning(pointcut="@annotation(myLog)",returning="returnVal")
    public void afterReturn(JoinPoint joinPoint, Log myLog, Object returnVal){
        //通知-在目标方法正常完成后做增强
        log.info("进来了LogAspect afterReturn， returnVal是:{}", JSONObject.toJSONString(returnVal));
    }

    @AfterThrowing(pointcut="@annotation(myLog)",throwing="error")
    public void afterThrowing(JoinPoint joinPoint, Log myLog, Throwable error){
        //通知-主要用来处理程序中未处理的异常
    }

    /*@Around("pointCut()")
    public void around(ProceedingJoinPoint pjp){
        //通知-环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知
        System.out.println("AOP Aronud before...");
        pjp.proceed();//执行目标方法
        System.out.println("AOP Aronud after...");
    }*/
}
